package Dao;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import Negocio.Cotizacion;
import Negocio.ItemCotizacion;
import Persistencia.HibernateUtil;

public class CotizacionDao {
	
	private static CotizacionDao instancia = null;
	private static SessionFactory sf = null;
	
	public static CotizacionDao getInstancia() {
		if(instancia == null){
		sf = HibernateUtil.getSessionFactory();
			instancia = new CotizacionDao();
		} 
		return instancia;
	}

	
	public List<Cotizacion> obtenerCotizaciones() {
			Session session = sf.openSession();
			session.beginTransaction();
			Query query = session.createQuery("from Cotizacion");
			List<Cotizacion> lista = (List<Cotizacion>) query.list();			
			session.flush();
			session.getTransaction().commit();
			session.close();
			return lista;
		
	}
	
	public void salvar(Cotizacion c)
	{
		Session session = null;
		try {
			session = sf.openSession();			
			session.beginTransaction();
			session.save(c);		
			if(c.getItems()!=null)
			{
				Iterator<ItemCotizacion> it=c.getItems().iterator();
				while(it.hasNext())
				{
					session.save(it.next());
				}
			}
				
			session.getTransaction().commit();
			session.flush();
			session.close();		
		} catch (Exception e) {
			e.printStackTrace();
			if(session != null){
				session.getTransaction().rollback();	
				session.flush();
				session.close();
//				throw new RemoteException();
			}			
		}				
	}

	public Cotizacion obtenerCotizacion(int id) {
		Session session = sf.openSession();
		session.beginTransaction();
		Query query = session.createQuery("from Cotizacion where id = ?");
		query.setInteger(0, id);
		Cotizacion lista = (Cotizacion) query.uniqueResult();
		if(lista!=null)
		{
//			lista.getCompPrecios().getItems().size();
			lista.getItems().size();
			lista.getSolitudRodamientos().getItemsSolicitud().size();
		}
		session.flush();
		session.getTransaction().commit();
		session.close();
		return lista;
	}

	public List buscarPrecios(String codigo, String marca, String origen) {
		List lista = new ArrayList();
		
		Session session = sf.openSession();
		session.beginTransaction();
		
		SQLQuery query = session.createSQLQuery(
				"select r.precio, r.codigo, r.marca, r.caracteristica, o.descripcion " +
				"from rodamiento r, pais_origen o " +
				"where r.id_origen = o.pais_origen_id " +
				"and (? is null or r.codigo = ?) " +
				"and (? is null or r.marca = ?) " +
				"and (? is null or r.id_origen = ?)");				
		query.setString(0, codigo);
		query.setString(1, codigo);
		query.setString(2, marca);
		query.setString(3, marca);
		query.setString(4, origen);
		query.setString(5, origen);
		lista =  query.list();		
		session.flush();
		session.getTransaction().commit();
		session.close();
		
		return lista;		
	}

}
